import {
    filterCustomButtonsJsFunctions,
    loopAddButtons
} from "@/plugins/pageoffice/pageoffice-common.js";
import {isNull} from "@/utils/validate.js";
import modal from "@/plugins/modal.js";
import {ElMessageBox} from "element-plus";

//是否启用修订
let isEnableTrackRevisions = true
//初始痕迹数量
let initRevisionCount = 0
//当前痕迹数组索引
let currentArrIndex = 0
//标识是否点击过下一个痕迹按钮
let bIsClickNextRev = false

//PageOfficeCtrl 所需通用JS函数
const commonJsFunctions = {
    // PageOffice的初始化事件回调函数，函数名是指定的的，不能修改，您可以在这里进行添加自定义按钮等操作
    // 不同组件中调用时可根据实际需求重写该函数，
    OnPageOfficeCtrlInit: () => {
        // 添加通用自定义按钮，这些自定义按钮执行的js函数需要在 window.POPageMounted 挂载
        pageofficeCtrlUtil.addCustomButtons()
    },
    //控件打开后执行的事件，函数名是指定的，不可修改，不同组件中调用时可根据实际业务需求重写该函数，
    AfterDocumentOpened: () => {
        //启用修订
        pageofficectrl.word.SetTrackRevisions(true)
    },
    switchFullScreen: () => {
        pageofficectrl.FullScreen = !pageofficectrl.FullScreen
    },
    closePOBrowser: () => {
        pageofficectrl.CloseWindow()
    }
}

//自定义按钮所需的所有通用JS函数（不需要根据业务需求重写的js函数）
const customButtonsCommonJsFunctions = {
    //另存
    saveAsFile: () => {
        pageofficectrl.ShowDialog(3)
    },
    //打印
    printFile: () => {
        pageofficectrl.ShowDialog(4)
    },
    //启用、取消修订
    setTrackRevisions: () => {
        isEnableTrackRevisions = !isEnableTrackRevisions
        pageofficectrl.word.SetTrackRevisions(isEnableTrackRevisions)
    },
    //接受所有修订
    acceptAllRevisions: () => {
        pageofficectrl.AcceptAllRevisions()
    },
    //显示隐藏痕迹
    showOrHideRevisions: () => {
        pageofficectrl.ShowRevisions = !pageofficectrl.ShowRevisions
    },
    //上一个痕迹
    previousRevision: () => {
        let revisionCount = getRevisionCountInWord()
        if (revisionCount === 0) {
            pageofficeCtrlUtil.msgInfo('当前文档中尚未留有痕迹')
            return false
        }
        //再次修改Word内容后，痕迹数量与初始打开文件时不同； 或者没有点击过下一个按钮时，默认选中第一个痕迹
        if (revisionCount !== initRevisionCount) {
            if (bIsClickNextRev) {
                pageofficeCtrlUtil.msgInfo('痕迹数量发生了变化，默认定位到第一处痕迹')
            }
            pageofficectrl.word.SelectRevision(0)
            initRevisionCount = revisionCount
            currentArrIndex = 0
        } else if (currentArrIndex === 0) {
            pageofficeCtrlUtil.msgInfo('当前已到达第一处痕迹')
            return false
        } else {
            currentArrIndex--
            pageofficectrl.word.SelectRevision(currentArrIndex)
        }
    },
    //下一个痕迹
    nextRevision: () => {
        let revisionCount = getRevisionCountInWord()
        if (revisionCount === 0) {
            pageofficeCtrlUtil.msgInfo('当前文档中尚未留有痕迹')
            return false
        }
        //再次修改Word内容后，痕迹数量与初始打开文件时不同；或者没有点击过下一个按钮时，默认选中第一个痕迹
        if (revisionCount !== initRevisionCount) {
            if (bIsClickNextRev) {
                pageofficeCtrlUtil.msgInfo('痕迹数量发生了变化，默认定位到第一处痕迹')
            }
            pageofficectrl.word.SelectRevision(0)
            initRevisionCount = revisionCount
            bIsClickNextRev = true
        } else {
            if (currentArrIndex < (revisionCount - 1)) {
                currentArrIndex++
                pageofficectrl.word.SelectRevision(currentArrIndex)
            } else {
                pageofficeCtrlUtil.confirm('已到达最后一个痕迹的位置，是否跳转到第一个痕迹的位置？', function () {
                    currentArrIndex = 0
                    pageofficectrl.word.SelectRevision(currentArrIndex)
                })
            }
        }
    },
    //比较版本1
    showFile1View: () => {
        pageofficectrl.word.ShowCompareView(1)
    },
    //比较版本2
    showFile2View: () => {
        pageofficectrl.word.ShowCompareView(2)
    },
    //显示比较结果
    showCompareView: () => {
        pageofficectrl.word.ShowCompareView(0)
    },
    //添加键盘批注
    addComment: () => {
        let selectText = pageofficectrl.word.GetTextFromSelection()
        pageofficectrl.word.InsertComment(selectText)
    },
    deleteAllComments: () => {
        let commentsListJson = pageofficectrl.word.CommentsAsJson
        if (!isNull(commentsListJson)) {
            let commentsList = JSON.parse(commentsListJson)
            for (let i = commentsList.length -1 ; i >= 0; i--) {
                pageofficectrl.word.DeleteComment(i)
            }
        }
    },
    addSeal: () => {
        //盖章时需要输入用户名密码，盖章后保护文档，文档不可继续编辑
        pageofficectrl.zoomseal.AddSeal()
    },
    addHandSign: () => {
        //签字时需要输入用户名密码，签字后保护文档，文档不可继续编辑
        pageofficectrl.zoomseal.AddHandSign()
    },
}

//获取痕迹数量
function getRevisionCountInWord() {
    let revisionsJson = pageofficectrl.word.RevisionsAsJson
    if (isNull(revisionsJson)) {
        return 0
    }
    let revisionObj = JSON.parse(revisionsJson)
    return revisionObj.length
}

//获取批注数量
function getCommentCountInWord() {
    let commentsListJson = pageofficectrl.word.CommentsAsJson
    if (isNull(commentsListJson)) {
        return 0
    }
    let commentsObj = JSON.parse(commentsListJson)
    return commentsObj.length
}

/**
 * 为 PageOfficeCtrl控件 添加通用按钮：全屏、关闭按钮等
 */
function addCommonButtons() {
    const btnArray = [
        ["全屏", "switchFullScreen", 4],
        ["关闭", "closePOBrowser", 21],
    ]
    loopAddButtons(btnArray, false)
}

/**
 * PageOfficeCtrl控件窗口中使用的提示框
 * @param content 提示信息
 * @param type 提示框样式：info、error、success
 */
function pageofficeCtrlMessageBox(content, type) {
    pageofficectrl.Enabled = false
    ElMessageBox.alert(content, '', {
        confirmButtonText: '确定',
        buttonSize: 'small',
        showClose: false,
        type: type,
        callback: (action) => {
            pageofficectrl.Enabled = true
        }
    })
}

const pageofficeCtrlUtil = {
    /**
     *
     * 挂载PageOfficeCtrl控件所需调用的js函数（包括 控件绑定的事件、添加的自定义按钮所执行的js函数等）
     * @param customJsFunctions 除通用js函数外，每个Pageoffice控件所需的其他自定义js函数
     * @param customButtonsArray 自定义按钮参数组成的二维数组：[[caption1, jsFunctionName1, iconIndex1], [caption2, jsFunctionName2, iconIndex2], ...]
     */
    jsFunctionMounted(customJsFunctions, customButtonsArray) {
        const customButtonsJsFunctions = filterCustomButtonsJsFunctions(customButtonsArray, customButtonsCommonJsFunctions)
        //将需要回调的函数挂载到PageOffice控件，例如控件触发的事件、自定义按钮触发的函数。POPageMounted为指定属性名，不能修改
        window.POPageMounted = {...commonJsFunctions, ...customJsFunctions, ...customButtonsJsFunctions}
    },

    //获取Word中的痕迹数量
    getRevisionCount() {
        return getRevisionCountInWord()
    },

    //获取Word中的批注数量
    getCommentCount() {
        return getCommentCountInWord()
    },

    /**
     * 根据业务需求添加所需的自定义按钮，例如：保存、打印等按钮
     * @param customBtnArray
     */
    addCustomButtons(customBtnArray) {
        //根据业务需求添加所需的自定义按钮，例如：保存、打印按钮等
        loopAddButtons(customBtnArray, false)
        //添加通用按钮：全屏、关闭按钮等
        addCommonButtons()
    },

    msgInfo(content) {
        pageofficeCtrlMessageBox(content, 'info')
    },

    msgSuccess(content) {
        pageofficeCtrlMessageBox(content, 'success')
    },

    msgError(content) {
        pageofficeCtrlMessageBox(content, 'error')
    },

    /**
     * PageOffice 控件窗口中使用的确认提示框
     * @param message 提示消息
     * @param confirmFunctionName 确认后执行的JS函数名
     * @param conformParams 确认执行函数所需的参数
     * @param successFunctionName 确认执行成功后继续执行的JS函数名
     * @param successParams 执行成功后继续执行的JS函数所需的参数
     */
    confirm(message, confirmFunctionName, conformParams, successFunctionName, successParams) {
        pageofficectrl.Enabled = false
        modal.confirm(message).then(() => {
            modal.loading('正在执行，请稍后...')
            return confirmFunctionName(conformParams)
        }).then(() => {
            pageofficectrl.Enabled = true
            modal.closeLoading()
            if (successFunctionName) {
                successFunctionName(successParams)
            }
        }).catch((error) => {
            pageofficectrl.Enabled = true
            modal.closeLoading()
            modal.alertError(error)
        })
    }
}

export default pageofficeCtrlUtil

export function saveWord(saveFilePage, saveDataPage) {
    if (saveFilePage) {
        //设置保存文件地址
        pageofficectrl.SaveFilePage = saveFilePage
    }
    if (saveDataPage) {
        //设置保存数据区域地址
        pageofficectrl.SaveDataPage = saveDataPage
    }
    //执行保存
    pageofficectrl.WebSave()
    let expectedReturnResult = 'ok'
    if (saveFilePage && saveDataPage) {
        expectedReturnResult = 'ok\nok'
    }
    //服务端返回保存结果
    let strCustomSaveResult = pageofficectrl.CustomSaveResult
    if (expectedReturnResult === strCustomSaveResult) {
        pageofficeCtrlUtil.msgSuccess('保存成功')
    }
}

/**
 * 刷新父页面中的痕迹数量，用于下一步操作时的判断条件
 * @param revisionCount
 * @returns {{refreshRevisionCount: ((function(*): string)|*)}}
 */
export function refreshParentRevisionCountFunction(revisionCount) {
    onMounted(()=> {
        //此行必须放在onMounted事件中，否则pageoffice无法回调
        window.POPageMounted={refreshRevisionCount}
    })

    /**
     * pageoffice页面回调父页面，刷新痕迹数量
     * @param obj
     * @returns {string} 此函数必须有返回值，否则执行完当前函数后，会进入 CallParentFunc 的 error函数，而非 success 函数
     */
    function refreshRevisionCount(obj) {
        if(!isNull(obj)) {
            revisionCount.value = JSON.parse(obj).revisionCount
            return 'success'
        } else {
            return 'error'
        }
    }

    return {
        refreshRevisionCount
    }
}

/**
 * 回调 PageOffice 父页面js函数
 * @param parentFunctionJsonObj 父页面js函数所需参数，json对象
 * @param parentFunctionName 父页面js函数名，字符串
 * @param sucFunction 父页面js函数执行成功后，子页面继续执行的其他js函数
 */
export function callbackPOParentFunction(parentFunctionJsonObj, parentFunctionName, sucFunction) {
    parentFunctionJsonObj = parentFunctionJsonObj ? JSON.stringify(parentFunctionJsonObj) : null
    CallParentFunc({
        funcName: parentFunctionName,
        paramJson: parentFunctionJsonObj,
        success: function (result) {
            if(result.indexOf('parentlost') >= 0) {
                pageofficeCtrlUtil.msgError('父页面可能关闭或跳转刷新了，请重新打开当前窗口后再执行当前操作。')
            } else if (result === 'error'){
                //注：'error' 为父页面自定义返回值，可根据需求自行调整
                pageofficeCtrlUtil.msgError('回调父页面失败，请刷新页面并重新打开当前窗口后再执行当前操作')
            } else {
                //result === 'ok' 或其他返回值
                if (sucFunction && typeof sucFunction === 'function') {
                    sucFunction()
                }
            }
        },
        error: function (result) {
            pageofficeCtrlUtil.msgError(result)
        }
    })
}


